/**
 * 文件工具类
 * 提供文件相关的工具方法
 */

/**
 * 获取文件扩展名
 * @param {String} fileName 文件名
 * @returns {String} 文件扩展名（小写）
 */
function getFileExt(fileName) {
  if (!fileName) return '';
  
  const lastDot = fileName.lastIndexOf('.');
  if (lastDot === -1) return '';
  
  return fileName.substring(lastDot + 1).toLowerCase();
}

/**
 * 格式化文件大小
 * @param {Number} size 文件大小（字节）
 * @returns {String} 格式化后的文件大小
 */
function getFormatSize(size) {
  if (size === null || size === undefined || size === '') return '0 B';
  
  const units = ['B', 'KB', 'MB', 'GB', 'TB'];
  let index = 0;
  let fileSize = parseFloat(size);
  
  while (fileSize >= 1024 && index < units.length - 1) {
    fileSize /= 1024;
    index++;
  }
  
  return fileSize.toFixed(2) + ' ' + units[index];
}

/**
 * 获取文件图标
 * @param {String} fileName 文件名
 * @returns {String} 文件图标类名
 */
function getFileIcon(fileName) {
  const ext = getFileExt(fileName);
  
  // 根据扩展名确定图标类名
  if (['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp'].includes(ext)) {
    return 'icon-image';
  } else if (ext === 'pdf') {
    return 'icon-pdf';
  } else if (['doc', 'docx'].includes(ext)) {
    return 'icon-word';
  } else if (['xls', 'xlsx'].includes(ext)) {
    return 'icon-excel';
  } else if (['ppt', 'pptx'].includes(ext)) {
    return 'icon-ppt';
  } else if (['zip', 'rar', '7z'].includes(ext)) {
    return 'icon-zip';
  } else if (['mp4', 'avi', 'mov', 'wmv', 'flv', 'mkv'].includes(ext)) {
    return 'icon-video';
  } else if (['mp3', 'wav', 'ogg', 'flac', 'aac'].includes(ext)) {
    return 'icon-audio';
  } else {
    return 'icon-file';
  }
}

/**
 * 检查文件是否为图片
 * @param {String} fileName 文件名
 * @returns {Boolean} 是否为图片
 */
function isImageFile(fileName) {
  const ext = getFileExt(fileName);
  return ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg'].includes(ext);
}

/**
 * 检查文件是否为文档
 * @param {String} fileName 文件名
 * @returns {Boolean} 是否为文档
 */
function isDocFile(fileName) {
  const ext = getFileExt(fileName);
  return ['doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'pdf', 'txt'].includes(ext);
}

/**
 * 检查文件是否为音频
 * @param {String} fileName 文件名
 * @returns {Boolean} 是否为音频
 */
function isAudioFile(fileName) {
  const ext = getFileExt(fileName);
  return ['mp3', 'wav', 'ogg', 'flac', 'aac', 'm4a'].includes(ext);
}

/**
 * 检查文件是否为视频
 * @param {String} fileName 文件名
 * @returns {Boolean} 是否为视频
 */
function isVideoFile(fileName) {
  const ext = getFileExt(fileName);
  return ['mp4', 'avi', 'mov', 'wmv', 'flv', 'mkv'].includes(ext);
}

/**
 * 生成唯一的文件名
 * @param {String} fileName 原文件名
 * @returns {String} 生成的唯一文件名
 */
function generateUniqueFileName(fileName) {
  if (!fileName) return '';
  
  const ext = getFileExt(fileName);
  const timestamp = new Date().getTime();
  const random = Math.floor(Math.random() * 10000);
  
  // 保留原始文件名的前20个字符
  let baseName = fileName;
  if (ext) {
    baseName = fileName.substring(0, fileName.length - ext.length - 1);
  }
  baseName = baseName.substring(0, 20).replace(/[^a-zA-Z0-9]/g, '_');
  
  // 生成新文件名: 部分原名_时间戳_随机数.扩展名
  return `${baseName}_${timestamp}_${random}${ext ? '.' + ext : ''}`;
}

module.exports = {
  getFileExt,
  getFormatSize,
  getFileIcon,
  isImageFile,
  isDocFile,
  isAudioFile,
  isVideoFile,
  generateUniqueFileName
}; 